﻿using System;

namespace 面向对象_委托
{
    class Program
    {
        // 有一个老师
        /*
         * 讲课
         * 打球 （一般喊学生一起打球）
         * 吃冰淇淋（一般让学生出去买冰激凌，并给钱）
        */
        
        // 有一个学生
        /*
           学习（老师临时安排的事情）
           
         */


        //有返回值和有参数的delegate
        public  delegate int a(int age, string name);
        //无返回值有参数的Action

        static void Main(string[] args)
        {
            //a ace = b;
            //int e = ace(20, "666");

            ac ace = new ac();
            //ac.学生();
            // Do doo = A; //如果 委托的实例为null ，也就是没有指向任何函数，使用 doo() 这种形式调用会报空。推荐使用 doo?.invoke() 
            // 方法的签名不一致，会导致报错，解决方案：签名同步
            
            bool b =ACE.A("憨憨",50);//有返回值有参数的委托方法
            Console.WriteLine(b);
            ACE.B();//没返回值也没用参数的委托方法
            int i = ACE.C();//没参数但是有返回值的委托
            Console.WriteLine(i);
            


        }

    }
    class ac
    {
       public static void xuexi(weituo zhangsan)
        {
            
            //学生学习40遍，到第20遍来个人给50买冰淇淋，或者陪他打会球，学到40遍暂停。
            for (int i = 1; i <= 40; i++)
            {
                if (i == 20)
                {
                    买冰淇淋或者打球(50,"奥利奥味的冰淇淋","篮球");
                }
                 else if (i == 40)
                {
                    Console.WriteLine("到第40遍了，休息");
                    break;
                }
                
            }
        }
        public delegate void weituo(int qian,string bql,string qiu);
        public static void 买冰淇淋或者打球(int qian,string bql,string qiu)
        {
            Random a = new Random();
            //a.Next(2);
            if (a.Next(2)==0)
            {
                Console.WriteLine($"给我{qian}元，我去给你买{bql}");
            }
            else
            {
                Console.WriteLine($"走我陪你打{qiu}");
            }
            
        }
    }
    // delegate :委托
    // 委托就是将一个方法作为参数进行传递
    // do : 做什么事情
    // thing :事情 
    // count （length）：数量
    public  delegate bool Do(string thing, int count);//有参数，有返回值的委托

    // 无参数，无返回值的委托
    public  delegate void Do2();
    // 无参数，有int 返回值的委托
    public delegate int Function();

    // 委托一般用在观察者模式中（也叫监听模式）
    class ACE
    {
        public static bool A(string thing,int count)//有返回值，有参数的返回值
        {
            Console.WriteLine($"{thing}{count}");
            return true;
        }
        public static void B()//无返回值无参数的方法。
        {
            Console.WriteLine(50);
        }
        public static  int C()//有返回值无参数的方法
        {
            Console.WriteLine("放屁");
            return 10;
        }
    }
}
